# -*- coding: utf-8 -*-
# author: sixmillions
# date: 2022/3/16

# 变量
'''
第一个字符必须是字母表中字母或下划线 _ 。
标识符的其他的部分由字母、数字和下划线组成。
标识符对大小写敏感。
保留字即关键字，我们不能把它们用作任何标识符名称。Python 的标准库提供了一个 keyword 模块，可以输出当前版本的所有关键字
'''
import keyword

print(keyword.kwlist)
# 结果： ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

# 不可变数据（3 个）：Number（数字）、String（字符串）、Tuple（元组）；
# 值类型(不可改变：int str tuple)
a = 3
b = a
a = 1
print(b)  # 3

# 可变数据（3 个）：List（列表）、Dictionary（字典）、Set（集合）。
# 引用类型（可变：list set dict）
d = [1, 2, 3]
e = d
d[0] = 'A'
print(e)  # ['A', 2, 3]

# 字符串不可改变
s = "hello"
print(id(s))  # 内存地址
# 下面这行代码操作报错，因为字符串不可变
# s[0] = "A"
s = s + "world"  # 已经变成了一个新的字符串
print(id(s))

# 元组不可变
t1 = (1, 2, 3)
# t1[0] = 5 # 报错
# 元组里面的列表可以改变
t2 = (1, 2, 3, ["a", "B"])
print(t2)  # (1, 2, 3, ['a', 'B'])
t2[-1][0] = "A"
print(t2)  # (1, 2, 3, ['A', 'B'])

# Python 中的变量不需要声明。每个变量在使用前都必须赋值，变量赋值以后该变量才会被创建。
# print(xxx) # xxx没有定义会报错

# 在 Python 中，变量就是变量，它没有类型，我们所说的"类型"是变量所指的内存中对象的类型。
v = 66
print(type(v))  # <class 'int'>
v = 'hello'
print(type(v))  # <class 'str'>
v = [1, 2, 3]
print(type(v))  # <class 'list'>

# del语句删除一些对象引用
a = 66
print(a)  # 66
del a
# print(a)  # 上面删除了变量，所以这里会报错

c, d = 2, 'six'
print(c, d)  # 2 six
del c, d
# print(c, dbm)  # 上面删除了变量，所以这里会报错
